package com.woniuxy.microsystemuapserver.shiro;

/**
 * @Author: huhenggg
 * @Date: 2021/1/5 0005 下午 5:44
 */

import com.woniuxy.microsystemuapserver.bean.UserBean;
import com.woniuxy.microsystemuapserver.service.UserService;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * shiro框架中，用来完成身份认证，授权的对象
 *
 */
public class LoginAndAuthRealm extends AuthorizingRealm {
    @Autowired
    private UserService userServiceImpl;
    /**
     * 授权方法
     * 需要使用<shiro> | @Shiro相同注解 才能触发
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }
    /**
     * 身份认证方法
     * 需要在用户登录系统时触发
     * @param authenticationToken 携带用户名和密码的Token令牌对象
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("开始认证！++++++=");
        //返回的当前主体令牌中的登录名
        String loginName = (String)authenticationToken.getPrincipal();
        UserBean userBean = userServiceImpl.login(loginName);
        System.out.println(loginName + "配置类中查出的loginName");
        System.out.println(userBean + "配置类中查出的UserBean");
        if(userBean == null){
            return null;
        }
        //所谓盐值加密，就是加密之后，再添加一部分内容，再加密
        // ByteSource 如果使用颜值加密需要创建ByteSource及对应的info对象
        ByteSource byteSource = new InitByteSource(loginName);
        //返回认证信息 (登录名，密码，域的名称)
        return new SimpleAuthenticationInfo(loginName,userBean.getPassword(),byteSource,getName());
    }
}